home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / uhren & terminkalender / time / sclock / source / main.c < prev    next >
C/C++ Source or Header  |  1996-04-07  |  14KB  |  717 lines

  1. /****************************************************************************
  2. *
  3. * VERSION
  4. *    $VER: main.c 1.72 (30.12.93)
  5. *
  6. * DESCRIPTION
  7. *    Main code for SClock...
  8. *
  9. * AUTHOR
  10. *    Rune Johnsrud
  11. *
  12. * COPYRIGHT
  13. *    (c) 1993 Amiga Freelancers
  14. *
  15. *****************************************************************************/
  16.  
  17. #define INTUI_V36_NAMES_ONLY
  18.  
  19. #include <exec/exec.h>
  20. #include <exec/types.h>
  21. #include <exec/memory.h>
  22. #include <exec/alerts.h>
  23. #include <dos/dos.h>
  24. #include <intuition/intuition.h>
  25. #include <graphics/modeid.h>
  26. #include <intuition/screens.h>
  27. #include <libraries/diskfont.h>
  28. #include <libraries/asl.h>
  29. #include <libraries/gadtools.h>
  30. #include <workbench/workbench.h>
  31. #include <devices/timer.h>
  32. #include <utility/date.h>
  33. #include <datatypes/datatypes.h>
  34.  
  35. #include <clib/intuition_protos.h>
  36. #include <clib/graphics_protos.h>
  37.  
  38. #include <pragmas/intuition_pragmas.h>
  39. #include <pragmas/graphics_pragmas.h>
  40.  
  41. #include <proto/exec.h>
  42. #include <proto/dos.h>
  43. #include <proto/diskfont.h>
  44. #include <proto/asl.h>
  45. #include <proto/icon.h>
  46. #include <proto/gadtools.h>
  47. #include <proto/timer.h>
  48. #include <proto/datatypes.h>
  49.  
  50. #include <string.h>
  51.  
  52. #include "global.h"
  53.  
  54. /************************************************************************/
  55.  
  56. char __stdiowin[] = "";
  57. char __stdiov37[] = "";
  58.  
  59. /************************************************************************/
  60.  
  61. UBYTE versiontag[] = "$VER: SClock V1.72 (30.12.93)";
  62.  
  63. UBYTE AboutText[]  = "SClock V1.72 (30.12.93)\n\n"
  64.                      "Written by Rune Johnsrud\n\n"
  65.                      "(c) 1993 Amiga Freelancers";
  66.  
  67. /************************************************************************/
  68.  
  69. UBYTE *ErrMsg[] =
  70. {
  71.     NULL,
  72.     NULL,
  73.     "This program can only be started from Workbench",
  74.     "Couldn't open intuition.library V39",
  75.     "Couldn't open graphics.library V39",
  76.     "Couldn't open diskfont.library V39",
  77.     "Couldn't open asl.library V39",
  78.     "Couldn't open gadtools.library V39",
  79.     "Couldn't open icon.library V39",
  80.     "Couldn't open utility.library V39",
  81.     "Couldn't open datatypes.library V39",
  82.     "Couldn't open timer.device",
  83.     "Couldn't allocate asl requester",
  84.     "Couldn't obtain datatype attrs",
  85.     "Couldn't do datatype method",
  86.     "Unable to start screen mode prefs notification",
  87.     "Couldn't lock specified public screen",
  88.     "Couldn't open window",
  89.     "No icon arguments",
  90.     "Couldn't read icon",
  91.     "Couldn't write icon",
  92.     "Couldn't open specified font",
  93.     "Couldn't create menus",
  94.     "Couldn't obtain visual info",
  95.     "Window size error, truncating window",
  96.     "Couldn't allocate memory",
  97.     "Couldn't allocate signal",
  98.     "Unknow error",
  99. };
  100.  
  101. UBYTE ErrReqTitle[]     = "Error";
  102. UBYTE ErrReqBody[]      = "%s, Error: %ld\n\n%s";
  103. UBYTE ErrReqGad[]       = "OK";
  104. UBYTE PErrReqBody[]        = "%s, Error: %ld - %s\n";
  105. UBYTE ReqTitle[]        = "SClock Request";
  106. UBYTE FontReqTitle[]    = "Select New Font...";
  107. UBYTE FileReqTitle[]    = "Select New Backdrop Picture...";
  108.  
  109. /************************************************************************/
  110.  
  111. struct Gadget ClockGadget =
  112. {
  113.     NULL,
  114.     0,
  115.     0,
  116.     0,
  117.     0,
  118.     GFLG_GADGHNONE,
  119.     GACT_IMMEDIATE,
  120.     GTYP_SYSGADGET | GTYP_WDRAGGING,
  121.     NULL,
  122.     NULL,
  123.     NULL,
  124.     0,
  125.     NULL,
  126.     0,
  127.     NULL
  128. };
  129.  
  130. struct ClockInfo DefClockInfo =
  131. {
  132.     NULL,
  133.     CT_DIGITAL,
  134.     NULL,
  135.     11,
  136.     NULL,
  137.     0,
  138.     0,
  139.     100,
  140.     100,
  141.     0,
  142.     0,
  143.     0,
  144.     0,
  145.     0,
  146.     {
  147.         0, 0, 0, 0, 0, 35, 35,
  148.         50, 50, 50, 50,
  149.         0, 0, 0, 0, 0, 0
  150.     },
  151.     {
  152.         1, 0, 1, 1, 1, 2, 1
  153.     },
  154.  
  155. //    FALSE,        /* ShowTime        */
  156.     TRUE,        /* ShowDate     */
  157.     FALSE,        /* ShowSec        */
  158.     TRUE,        /* WinBevel        */
  159.     FALSE,        /* BDClock        */
  160.     FALSE,        /* LockPos        */
  161.  
  162.     FALSE,        /* PlaceClock    */
  163.     FALSE,        /* ShowDial        */
  164.     FALSE,        /* AutoSize        */
  165.  
  166.     1,
  167.     3,
  168.     2,
  169.     1,
  170.     ".",
  171.     ":",
  172.     0,
  173.     2,
  174.     4,
  175.  
  176. //    1
  177. };
  178.  
  179. /************************************************************************/
  180.  
  181. #define MENU_ID_PROJECT        0
  182. #define   ITEM_ID_ABOUT        0
  183. #define      ITEM_ID_QUIT      2
  184. #define MENU_ID_SETTINGS    1
  185. #define   ITEM_ID_FONT        0
  186. #define   ITEM_ID_BACKDR    1
  187. #define   ITEM_ID_SAVESET    3
  188.  
  189. struct NewMenu MainMenus[] =
  190. {
  191.     { NM_TITLE, "Project",        0 , 0, 0, 0,},
  192.     {  NM_ITEM, "About",         "?", 0, 0, 0,},
  193.     {  NM_ITEM, NM_BARLABEL,      0 , 0, 0, 0,},
  194.     {  NM_ITEM, "Quit",          "Q", 0, 0, 0,},
  195.  
  196.     { NM_TITLE, "Settings",       0 , 0, 0, 0,},
  197.     {  NM_ITEM, "Font...",       "F", 0, 0, 0,},
  198.     {  NM_ITEM, "Backdrop...",   "B", 0, 0, 0,},
  199.     {  NM_ITEM, NM_BARLABEL,      0,  0, 0, 0,},
  200.     {  NM_ITEM, "Save Settings", "S", 0, 0, 0,},
  201.     {  NM_END,  NULL,             0 , 0, 0, 0,},
  202. };
  203.  
  204. /************************************************************************/
  205.  
  206. extern struct ExecBase *SysBase;
  207. extern struct DosLibrary *DOSBase;
  208. struct Library *IntuitionBase;
  209. struct Library *GfxBase;
  210. struct Library *DiskfontBase;
  211. struct Library *AslBase;
  212. struct Library *IconBase;
  213. struct Library *GadToolsBase;
  214. struct Library *TimerBase;
  215. struct Library *UtilityBase;
  216. struct Library *DataTypesBase;
  217.  
  218. struct GlobalData globaldata, *gd = &globaldata;
  219. struct ClockInfo *ci = &DefClockInfo;
  220.  
  221. /************************************************************************/
  222.  
  223. void __regargs __chkabort(void);    /* Turn of SAS CTRL-C checking */
  224.  
  225. WORD InitStart(int argc, char **argv);
  226. WORD CleanUp(VOID);
  227. WORD DoMagic(VOID);
  228.  
  229. WORD CreateAnalogClock(VOID);
  230. VOID RefreshAnalogClock(VOID);
  231. WORD DeleteAnalogClock(VOID);
  232. WORD CreateDigitalClock(VOID);
  233. VOID RefreshDigitalClock(VOID);
  234. WORD DeleteDigitalClock(VOID);
  235.  
  236. WORD ASL_RequestFont(VOID);
  237. WORD ASL_RequestFile(VOID);
  238.  
  239. WORD HandleWindowEvents(VOID);
  240. WORD HandleMenuEvents(struct IntuiMessage *imsg);
  241.  
  242.  
  243. /*** Main code **********************************************************/
  244.  
  245.  
  246. /**** Turn of SAS CTRL-C checking ****/
  247. void __regargs __chkabort(void)
  248. {
  249. }
  250. /*************************************/
  251.  
  252.  
  253. VOID main(int argc, char **argv)
  254. {
  255.     if (SysBase->LibNode.lib_Version >= MIN_LIB_VER)
  256.     {
  257.         gd->ErrCode = InitStart(argc, argv);
  258.  
  259.         if (gd->ErrCode) 
  260.             Error("Init Failed", gd->ErrCode);
  261.         else
  262.             Error("SClock", DoMagic());
  263.  
  264.         CleanUp();
  265.     }
  266. }
  267.  
  268.  
  269. WORD InitStart(int argc, char **argv)
  270. {
  271.     gd->VScreen        = NULL;
  272.     gd->ClockWindow    = NULL;
  273.  
  274.     if (argc == 0)
  275.     {
  276.         gd->IconArgs = (struct WBStartup *) argv;
  277.         gd->WBStart  = TRUE;
  278.     }
  279.     else
  280.     {
  281.         gd->WBStart = FALSE;
  282.         return INIT_ERR_NOTWBSTART;
  283.     }
  284.  
  285.     IntuitionBase = OpenLibrary("intuition.library", MIN_LIB_VER);
  286.     if (!IntuitionBase) return INIT_ERR_INTUITIONLIB;
  287.  
  288.     GfxBase = OpenLibrary("graphics.library", MIN_LIB_VER);
  289.     if (!GfxBase) return INIT_ERR_GRAPHICSLIB;
  290.  
  291.     GadToolsBase = OpenLibrary("gadtools.library", MIN_LIB_VER);
  292.     if (!GadToolsBase) return INIT_ERR_GADTOOLSLIB;
  293.  
  294.     DiskfontBase = OpenLibrary("diskfont.library", MIN_LIB_VER);
  295.     if (!DiskfontBase) return INIT_ERR_DISKFONTLIB;
  296.  
  297.     AslBase = OpenLibrary("asl.library", MIN_LIB_VER);
  298.     if (!AslBase) return INIT_ERR_ASLLIB;
  299.  
  300.     IconBase = OpenLibrary("icon.library", MIN_LIB_VER);
  301.     if (!IconBase) return INIT_ERR_ICONLIB;
  302.  
  303.     UtilityBase = OpenLibrary("utility.library", MIN_LIB_VER);
  304.     if (!UtilityBase) return INIT_ERR_UTILITYLIB;
  305.  
  306.     DataTypesBase = OpenLibrary("datatypes.library", MIN_LIB_VER);
  307.     if (!DataTypesBase) return INIT_ERR_DATATYPESLIB;
  308.  
  309.     TimerBase = NULL;
  310.  
  311.     if (!OpenTimerDevice()) return INIT_ERR_OPENDEVICE;
  312.  
  313.     gd->AslFontReq = AllocAslRequestTags(ASL_FontRequest,
  314.                         ASLFO_TitleText,    FontReqTitle,
  315.                         ASLFO_InitialWidth,    300,
  316.                         ASLFO_InitialHeight,375,
  317.                         ASLFO_MaxHeight,    127,
  318.                         TAG_END);
  319.  
  320.     if (!gd->AslFontReq) return INIT_ERR_ALLOCASLREQ;
  321.  
  322.     gd->AslFileReq = AllocAslRequestTags(ASL_FileRequest,
  323.                         ASLFR_TitleText,    FileReqTitle,
  324.                         ASLFR_InitialWidth,    300,
  325.                         ASLFR_InitialHeight,375,
  326.                         ASLFR_RejectIcons,    TRUE,
  327.                         TAG_END);
  328.  
  329.     if (!gd->AslFileReq) return INIT_ERR_ALLOCASLREQ;
  330.  
  331.     InitRastPort(&gd->FakeRP);
  332.  
  333.     ci->PubScreenName = (UBYTE *) &gd->StrBuff[0];
  334.     ci->FontName      = (UBYTE *) &gd->StrBuff[1];
  335.     ci->BDRPic           = (UBYTE *) &gd->StrBuff[2];
  336.  
  337.     return NOERROR;
  338. }
  339.  
  340.  
  341. WORD CleanUp(void)
  342. {
  343.     DeletePrefsNotify();
  344.  
  345.     if (gd->ClockWindow)    CleanUpClock();
  346.  
  347.     if (gd->AslFileReq)        FreeAslRequest(gd->AslFileReq);
  348.     if (gd->AslFontReq)        FreeAslRequest(gd->AslFontReq);
  349.     if (TimerBase)            CloseTimerDevice();
  350.  
  351.     if (DiskfontBase)        CloseLibrary(DiskfontBase);
  352.     if (GfxBase)            CloseLibrary(GfxBase);
  353.     if (IntuitionBase)        CloseLibrary(IntuitionBase);
  354.     if (GadToolsBase)        CloseLibrary(GadToolsBase);
  355.     if (AslBase)            CloseLibrary(AslBase);
  356.     if (IconBase)            CloseLibrary(IconBase);
  357.     if (UtilityBase)        CloseLibrary(UtilityBase);
  358.     if (DataTypesBase)        CloseLibrary(DataTypesBase);
  359.  
  360.     return NOERROR;
  361. }
  362.  
  363.  
  364. VOID Error(UBYTE *header, WORD errcode)
  365. {
  366.     UBYTE *p;
  367.  
  368.     if (errcode)
  369.     {
  370.         if (errcode == SYSERROR)
  371.             p = gd->SysErr;
  372.         else
  373.             p = ErrMsg[errcode];
  374.  
  375.         if (gd->WBStart)
  376.             EReq(gd->ClockWindow, ErrReqTitle, ErrReqBody, ErrReqGad, header, errcode, p);
  377.         else
  378.             Printf(PErrReqBody, header, errcode, p);
  379.     }
  380. }
  381.  
  382.  
  383. /************************************************************************/
  384.  
  385.  
  386. WORD DoMagic(void)
  387. {
  388.     WORD errcode = NOERROR, retval = NOACTION;
  389.  
  390.     if (errcode = ParseIconArgs(gd->IconArgs)) return errcode;
  391.     if (errcode = CreatePrefsNotify()) return errcode;
  392.  
  393.     gd->TmpFlags = ci->ShowDate;
  394.  
  395.     if (errcode = CreateClock()) return errcode;
  396.  
  397.     while (!retval)
  398.     {
  399.         retval = HandleWindowEvents();
  400.  
  401.         switch (retval)
  402.         {
  403.         case ACTION_CLOSEWINDOW:
  404.             if (errcode = CreateClock())
  405.                 retval = ACTION_QUIT;
  406.             else
  407.                 retval = NOACTION;
  408.             break;
  409.         }
  410.     }
  411.  
  412.     return errcode;
  413. }
  414.  
  415.  
  416. /*** Main handle stuff ****************************************************/
  417.  
  418.  
  419. WORD HandleWindowEvents(VOID)
  420. {
  421.     struct IntuiMessage *imsg;
  422.     BOOL done = FALSE;
  423.     ULONG signals;
  424.     WORD retval = NOACTION;
  425.  
  426.     while (!done)
  427.     {
  428.         signals = Wait((1L << gd->ClockWindow->UserPort->mp_SigBit) |
  429.                        (1L << gd->TimerPort->mp_SigBit)             |
  430.                         (1L << gd->PNSigNum));
  431.  
  432.         if (GetMsg(gd->TimerPort))
  433.         {
  434.             gd->TReq->tr_time.tv_secs  = 1;
  435.             gd->TReq->tr_time.tv_micro = 0;
  436.             SendIO((struct IORequest *) gd->TReq);
  437.             RefreshClock();
  438.         }
  439.  
  440.         if (signals & (1L << gd->PNSigNum))
  441.         {
  442.             CleanUpClock();
  443.             Delay(150);
  444.             CreateClock();
  445.         }
  446.  
  447.         while ((!done) && (imsg = GT_GetIMsg(gd->ClockWindow->UserPort)))
  448.         {
  449.             switch (imsg->Class)
  450.             {
  451.             case IDCMP_MENUPICK:
  452.                 if (retval = HandleMenuEvents(imsg)) done = TRUE;
  453.                 break;
  454.             }
  455.  
  456.             GT_ReplyIMsg(imsg);
  457.         }
  458.     }
  459.  
  460.     return retval;
  461. }
  462.  
  463.  
  464. WORD HandleMenuEvents(struct IntuiMessage *imsg)
  465. {
  466.     UWORD menucode;
  467.     WORD retval = NOACTION;
  468.  
  469.     menucode = imsg->Code;
  470.  
  471.     while (menucode != MENUNULL)
  472.     {
  473.         switch (MENUNUM(menucode))
  474.         {
  475.         case MENU_ID_PROJECT:
  476.             switch (ITEMNUM(menucode))
  477.             {
  478.             case ITEM_ID_ABOUT:
  479.                 EReq(gd->ClockWindow, ReqTitle, AboutText, "OK", NULL);
  480.                 break;
  481.  
  482.             case ITEM_ID_QUIT:
  483.                 retval = ACTION_QUIT;
  484.                 break;
  485.             }
  486.             break;
  487.  
  488.         case MENU_ID_SETTINGS:
  489.             switch (ITEMNUM(menucode))
  490.             {
  491.             case ITEM_ID_FONT:
  492.                 switch (ASL_RequestFont())
  493.                 {
  494.                 case ASL_REQ_OK:
  495.                     retval = ACTION_CLOSEWINDOW;
  496.                     break;
  497.                 case ASL_REQ_FAILED:
  498.                     Error("Asl-Request", gd->ErrCode);
  499.                     break;
  500.                 }
  501.                 break;
  502.  
  503.             case ITEM_ID_BACKDR:
  504.                 switch (ASL_RequestFile())
  505.                 {
  506.                 case ASL_REQ_OK:
  507.                     retval = ACTION_CLOSEWINDOW;
  508.                     break;
  509.                 case ASL_REQ_FAILED:
  510.                     Error("Asl-Request", gd->ErrCode);
  511.                     break;
  512.                 }
  513.                 break;
  514.  
  515.             case ITEM_ID_SAVESET:
  516.                 Error("Save Settings", SaveCurrSettings(gd->IconArgs));
  517.                 break;
  518.             }
  519.             break;
  520.         }
  521.  
  522.         menucode = (((struct MenuItem *) ItemAddress(gd->MainMenu, menucode))->NextSelect);
  523.     }
  524.  
  525.     return retval;
  526. }
  527.  
  528.  
  529. /************************************************************************/
  530.  
  531.  
  532. WORD CreateClock(VOID)
  533. {
  534.     WORD errcode = NOERROR;
  535.  
  536.     if (ci->LockPos) ClockGadget.GadgetType &= ~GTYP_WDRAGGING;
  537.  
  538.     if (ci->ClockType == CT_DIGITAL)
  539.     {
  540.         errcode = CreateDigitalClock();
  541.     }
  542.     else
  543.     {
  544.         errcode = CreateAnalogClock();
  545.     }
  546.  
  547.     return errcode;
  548. }
  549.  
  550.  
  551.  
  552. VOID RefreshClock(VOID)
  553. {
  554.     if (ci->ClockType == CT_DIGITAL)
  555.     {
  556.         RefreshDigitalClock();
  557.     }
  558.     else
  559.     {
  560.         RefreshAnalogClock();
  561.     }
  562. }
  563.  
  564.  
  565. WORD CleanUpClock(VOID)
  566. {
  567.     WORD errcode = NOERROR;
  568.  
  569.     if (ci->ClockType == CT_DIGITAL)
  570.     {
  571.         errcode = DeleteDigitalClock();
  572.     }
  573.     else
  574.     {
  575.         errcode = DeleteAnalogClock();
  576.     }
  577.  
  578.     return errcode;
  579. }
  580.  
  581.  
  582. /************************************************************************/
  583.  
  584.  
  585. WORD ASL_RequestFont(VOID)
  586. {
  587.     if (AslRequestTags(gd->AslFontReq,
  588.         ASLFO_Window,        gd->ClockWindow,
  589.         ASLFO_SleepWindow,    TRUE,
  590.         TAG_END))
  591.     {
  592.         gd->TextAttr = gd->AslFontReq->fo_Attr;
  593.         return ASL_REQ_OK;
  594.     }
  595.     else
  596.     {
  597.         if (IoErr() == 0)
  598.         {
  599.             gd->ErrCode = NOERROR;
  600.             return ASL_REQ_CANCEL;
  601.         }
  602.         else
  603.         {
  604.             gd->ErrCode = SYSERROR;
  605.             Fault(IoErr(), NULL, gd->SysErr, 254);
  606.             return ASL_REQ_FAILED;
  607.         }
  608.     }
  609. }
  610.  
  611.  
  612. WORD ASL_RequestFile(VOID)
  613. {
  614.     struct Hook filter;
  615.     static UBYTE buff[512];
  616.  
  617.     filter.h_Entry = FReqFilter;
  618.  
  619.     if (AslRequestTags(gd->AslFileReq,
  620.             ASLFR_Window,        gd->ClockWindow,
  621.             ASLFR_SleepWindow,    TRUE,
  622.             ASLFR_FilterFunc,    &filter,
  623.             TAG_END))
  624.     {
  625.         strncpy(buff, gd->AslFileReq->fr_Drawer, sizeof(buff));
  626.         AddPart(buff, gd->AslFileReq->fr_File, sizeof(buff));
  627.  
  628.         ci->BDRPic = (UBYTE *) &buff;
  629.         return ASL_REQ_OK;
  630.     }
  631.     else
  632.     {
  633.         if (IoErr() == 0)
  634.         {
  635.             gd->ErrCode = NOERROR;
  636.             return ASL_REQ_CANCEL;
  637.         }
  638.         else
  639.         {
  640.             gd->ErrCode = SYSERROR;
  641.             Fault(IoErr(), NULL, gd->SysErr, 254);
  642.             return ASL_REQ_FAILED;
  643.         }
  644.     }
  645. }
  646.  
  647.  
  648. BOOL InitMainMenus(VOID)
  649. {
  650.     if (ci->ClockType == CT_ANALOG)
  651.     {
  652.         MainMenus[5].nm_Flags = NM_ITEMDISABLED;
  653.         MainMenus[6].nm_Flags = 0;
  654.     }
  655.     else
  656.     {
  657.         MainMenus[5].nm_Flags = 0;
  658.         MainMenus[6].nm_Flags = NM_ITEMDISABLED;
  659.     }
  660.  
  661.     gd->MainMenu = CreateMenus((struct NewMenu *) &MainMenus, TAG_END);
  662.     if (!gd->MainMenu) return FALSE;
  663.  
  664.     if (!LayoutMenus(gd->MainMenu, gd->VisualInfo,
  665.             GTMN_NewLookMenus, TRUE,
  666.             TAG_END))
  667.     {
  668.         return FALSE;
  669.     }
  670.  
  671.     if (!SetMenuStrip(gd->ClockWindow, gd->MainMenu))
  672.         return FALSE;
  673.  
  674.     return TRUE;
  675. }
  676.  
  677.  
  678. LONG EReq(struct Window *w, UBYTE *title, UBYTE *bodytext, UBYTE *gadformat, APTR arg1, ...)
  679. {
  680.     static struct EasyStruct es;
  681.     struct Requester req;
  682.     LONG reqret;
  683.  
  684.     es.es_StructSize   = sizeof(struct EasyStruct);
  685.     es.es_Flags        = 0;
  686.     es.es_Title        = title;
  687.     es.es_TextFormat   = bodytext;
  688.     es.es_GadgetFormat = gadformat;
  689.  
  690.     if (w)
  691.     {
  692.         InitRequester(&req);
  693.  
  694.         if (Request(&req, w))
  695.         {
  696.             SetWindowPointer(w,
  697.                 WA_BusyPointer, TRUE,
  698.                 TAG_END);
  699.  
  700.             reqret = EasyRequestArgs(w, &es, NULL, &arg1);
  701.  
  702.             SetWindowPointer(w,
  703.                 WA_Pointer, NULL,
  704.                 TAG_END);
  705.  
  706.             EndRequest(&req, w);
  707.         }
  708.     }
  709.     else
  710.         reqret = EasyRequestArgs(NULL, &es, NULL, &arg1);
  711.  
  712.     return reqret;
  713. }
  714.  
  715.  
  716. /* End Of File */
  717.